package com.zhw;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.bson.Document;


/**
 * @author weizhang52
 * @description: TestMongodbSamplerClient类是必须通过继承AbstractJavaSamplerClient抽象类后，重写方法去实现的。
 * 而setupTest、runTest、teardownTest方法是完成整个测试声明周期，
 * 其中setupTest与teardownTest在整个线程执行中只执行一次用于初始化和结束
 * @date 2019/7/1
 * @modify
 */
public class TestMongodbSamplerC extends AbstractJavaSamplerClient {

    public static String host = null;
    public static int port = 0;
    public static int plusCount = 0;
    public String collection = "";
    public MongodbClient mongodbClient = null;
    public MongoCursor<Document> mongoCursor = null;
    /* 获取页面填写的参数 */

    @Override
    public Arguments getDefaultParameters() {
        //添加参数：实现jemeter界面(javaRequest)输入参数的设置
        Arguments arguments = new Arguments();
//        arguments.addArgument("interfaceName","");
//        arguments.addArgument("methodName","");
        // 设置参数，并赋予默认值0
        arguments.addArgument("plusCount","0");
        return arguments;
    }

    /**
     * public void setupTest(JavaSamplerContextcontext)，启动整个线程过程中，该方法只执行一次，在该方法中，
     * 我们可以做一些初始化事件的准备或者获取在JAVA Request中设置的参数的值
     *
     * @param context
     */
    @Override
    public void setupTest(JavaSamplerContext context) {

//         host = context.getParameter("host");
//     port = context.getIntParameter("port");
//     collection = context.getParameter("collection");
        plusCount = context.getIntParameter("plusCount");
        //某种连接只连接一次，例如数据库
        System.out.print("[setupTest] 测试开始,获取输入的plusCount="+plusCount);

    }

    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {

//        以下是runTest的代码模版
        // TODO Auto-generated method stub
        System.out.println("[runTest] 进入方法");
        // 必须要new一个SampleResult的实例对象，有该对象可以设定View Result tree的响应数据，最后需要返回对象
        SampleResult result = new SampleResult();
        // 该方法设定View Result Tree中显示的请求名称和Aggregate Report中的Label名称
        result.setSampleLabel("[runTest] MongodbSampler" + Thread.currentThread().getId());
        // 该方法设置执行的开始时间
        result.sampleStart();
        // 连接mongoDb数据库
        MongoDatabase mongoDatabase = MongodbClient.getConnect("localhost",27017,"analysis2");
        // 获取集合
        MongoCollection<Document> userCollection = mongoDatabase.getCollection("t_user_activity_info");
        MongoCollection<Document> timeCollection = mongoDatabase.getCollection("t_dt_distribution");
        userCollection.insertOne(createUserDoc(DateUtils.getDayStrByPlusNum(plusCount)));
        timeCollection.insertOne(createTimeDoc(DateUtils.getDayStrByPlusNum(plusCount)));
        System.out.println("[runTest] plusCount="+plusCount);
        System.out.println("[runTest] 新增数据成功");
        // 该方法设定响应的数据，在View Result Tree中可看到响应的数据
        result.setResponseData("未抛异常，响应成功","UTF-8");
//        mongodbClient.closeConnection();
        // 该方法设定执行是否成功
        result.setSuccessful(true);
        // 该方法设置执行结束时间
        result.sampleEnd();
        return result;

        /**
         * 当然result对象中原因不止目前介绍的几个操作方法，还有很多的操作，
         * 如果还需要其他的设置或者了解更多信息，可以对查看SampleResult类的源代码
         */

    }

    @Override
    public void teardownTest(JavaSamplerContext context) {
        System.out.print("[teardownTest] 测试结束");
    }


    public static Document createUserDoc(String statisticsDate){

        Document document = new Document("statisticsDate",statisticsDate)
                .append("hZero",1000).append("hOne",1000).append("hTwo",1000).append("hThree",1000)
                .append("hFour",1000).append("hFive",10000).append("hSix",1000).append("hSeven",1000)
                .append("hEight",1000).append("hNine",1000).append("hTen",1000).append("hEleven",1000)
                .append("hTwelve",1000).append("hThirteen",1000).append("hFourteen",1000).append("hFifteen",1000)
                .append("hSixteen",1000).append("hSeventeen",1000).append("hEighteen",1000).append("hNineteen",1000)
                .append("hTwenty",1000).append("hTwentyOne",1000).append("hTwentyTwo",1000).append("hTwentyThree",1000);

        return document;

    }

    public static Document createTimeDoc(String statisticsDate){

        Document document = new Document("statisticsDate",statisticsDate).append("activeCount",10000).append("activationCount",24000);

        return document;

    }

    /**
     *
     * 1、导出jar包
     * 2、拷贝导出的jar文件到JMeter的lib/ext目录下：将TestMongodbSampler.jar拷贝到JMeter的lib/ext目录下后，必须要重新启动JMeter工具才生效。
     * 3、执行TestMongodbSampler插件
     * 4、启动JMeter后分别创建线程组，Java Request组件，查看结果树以及聚合报告。
     * 5、创建Java Request组件请求，并且选中test.mongodb.sampler.TestMongodbSamplerClient，由于没有编写获取参数的代码，
     * 所以在Send Parameters With the Request中不用设置参数。
     * 6、运行成功后，查看View Result Tree中的响应数据
     * 7、以上就是整个编写Sampler组件到运行的整个过程，每一个步骤都是经过实践的。
     *
     */
    public static void main(String[] args) {

        TestMongodbSamplerC jmeterTest = new TestMongodbSamplerC();
        // 需要复写getDefaultParameters()方法
        JavaSamplerContext arg0 = new JavaSamplerContext(jmeterTest.getDefaultParameters());
        jmeterTest.runTest(arg0);
        jmeterTest.teardownTest(arg0);

    }

}
